﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ECommerce.Model.Productos
{
    public class Familia : Objeto 
    {
        public override string Ruta
        {
            get
            {
                string result = "";
                if (this.TieneMadre)
                    result = this.FamiliaMadre.Ruta + "\\" + this.Denominación;
                else
                    result = this.Denominación;
                return result;
            }
        }
        public override string NavigateUrl
        {
            get { return "/ExploradorDeProductos.aspx?IdFamilia=" + this.Id; }
        }
        private ECommerce.Model.Productos.Familia familaMadre;
        public ECommerce.Model.Productos.Familia FamiliaMadre
        {
            get { return familaMadre; }
            set { familaMadre = value; }
        }
        private ECommerce.Model.Productos.Familia[] familiasHijas;
        public ECommerce.Model.Productos.Familia[] FamiliasHijas
        {
            get { return familiasHijas; }
            set { familiasHijas = value; }
        }
        private ECommerce.Model.Productos.Producto[] productosHijos;
        public ECommerce.Model.Productos.Producto[] ProductosHijos
        {
            get { return productosHijos; }
            set { productosHijos = value; }
        }
        public void LoadFamiliasHijas()
        {
            this.FamiliasHijas = ECommerce.DAO.Cache.Productos.Familia.GetFamiliasHijas(this.Id);
            if (this.FamiliasHijas == null)
            {
                this.FamiliasHijas = ECommerce.DAO.SQL.Productos.Familia.GetFamiliasByFamiliaId(this.Id);
                if (this.FamiliasHijas!=null)
                    if (this.FamiliasHijas.Length > 0)
                        ECommerce.DAO.Cache.Productos.Familia.SetFamiliasHijas(this.FamiliasHijas, this.Id);
            }
        }
        public void LoadProductosHijos()
        {
            this.ProductosHijos = ECommerce.DAO.Cache.Productos.Producto.GetProductosByIdFamilia(this.Id);
            if (ProductosHijos == null)
            {
                this.ProductosHijos = ECommerce.DAO.SQL.Productos.Producto.GetProductosByIdFamilia(this.Id);
                if (ProductosHijos.Length > 0)
                    ECommerce.DAO.Cache.Productos.Producto.SetProductosByIdFamilia(this.ProductosHijos, this.Id);
            }
        }
        public bool TieneMadre
        {
            get
            {
                if (this.familaMadre != null)
                    return true;
                else
                    return false;
            }
        }
        public string ToString(string Formato)
        {
            switch (Formato)
            { 
                case "\\":
                    break;
                case ".":
                    break;
            }
            string result = "";
            if (this.TieneMadre)
                result = this.FamiliaMadre.ToString(Formato) + Formato + this.Denominación;
            else
                result = this.Denominación;
            return result;
        }
        public void LoadTreeNode(string Formato, string ImageUrl)
        {
            //Instancio el Nodo
            this.TreeNode = new System.Web.UI.WebControls.TreeNode();
            //Seteo la imagen del nodo
            if (ImageUrl != "")
                this.TreeNode.ImageUrl = ImageUrl;
            //Completo el campo Text
            if (Formato != "")
                this.TreeNode.Text = this.ToString(Formato);
            else
                this.TreeNode.Text = this.ToString();
            //Completo el campo Value con el Id
            this.TreeNode.Value = this.Id.ToString();
            //Defino la Url de Navegación
            this.TreeNode.NavigateUrl = "/exploradordeproductos.aspx?IdFamilia=" + this.Id.ToString();
            //Completo el Tooltip con la ruta
            this.TreeNode.ToolTip = this.ToString(".");
            //Cargo todas las Hijas
            if (this.FamiliasHijas!=null)
                if (this.FamiliasHijas.Length>0)
                    foreach (ECommerce.Model.Productos.Familia Hija in this.FamiliasHijas)
                    {
                        try
                        {
                            Hija.LoadFamiliasHijas();
                            Hija.LoadTreeNode(Formato, ImageUrl);
                            this.TreeNode.ChildNodes.Add(Hija.TreeNode);
                        }
                        catch { }
                    }
            if (this.ProductosHijos != null)
                if (this.ProductosHijos.Length > 0)
                    foreach (ECommerce.Model.Productos.Producto Hijo in this.ProductosHijos)
                    {
                        Hijo.LoadTreeNode(Formato,ImageUrl);
                        this.TreeNode.ChildNodes.Add(Hijo.TreeNode);
                    }
        }
        public override void Load(int ident)
        {
            base.Load(ident);
            this.Id = ident;
            this.Load(ECommerce.DAO.Cache.Productos.Familia.GetFamiliaById(ident));
            if (this.Id == 0)
            {
                this.Id = ident;
                this.Load(ECommerce.DAO.SQL.Productos.Familia.GetFamiliaById(ident));
                ECommerce.DAO.Cache.Productos.Familia.SetFamilia(this);
            }
        }
        public override void Load(ECommerce.Model.Objeto Familia)
        {
            base.Load(Familia);
            try
            {
                if (typeof(Familia).ToString() == "ECommerce.Model.Productos.Familia")
                {
                    if (Familia != null)
                    {
                        this.FamiliaMadre = ((ECommerce.Model.Productos.Familia)Familia).FamiliaMadre;
                        this.LoadFamiliasHijas();
                    }
                    else
                    {
                        this.FamiliaMadre = null;
                        this.FamiliasHijas = null;
                    }
                }
            }
            catch { }
        }
        public override void Load(System.Data.DataRow dr)
        {
            base.Load(dr);
            ECommerce.Factory.Productos.Familia.Load(this, dr);
            ECommerce.DAO.Cache.Productos.Familia.SetFamilia(this);
        }
        public override void Save()
        {
            base.Save();
            this.Id = ECommerce.DAO.SQL.Productos.Familia.SetFamilia(this);
            this.Id = ECommerce.DAO.Cache.Productos.Familia.SetFamilia(this);
            if (this.FamiliaMadre !=null)
                ECommerce.DAO.Cache.Productos.Familia.DelFamiliasHijas(this.FamiliaMadre.Id);
        }
        public override void Del()
        {
            base.Del();
            ECommerce.DAO.Cache.Productos.Familia.DelFamilia(this);
            if (this.FamiliaMadre != null)
                ECommerce.DAO.Cache.Productos.Familia.DelFamiliasHijas(this.FamiliaMadre.Id);

        }
        public string GetValuePath()
        {
            string result = "";
            if (this.TieneMadre)
                result = this.FamiliaMadre.GetValuePath() + "/" + this.Value;
            else
                result = this.Value;
            return result;
        }

    }
}
